/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package otcapp.controlador;

import java.awt.CardLayout;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
import otcapp.controlador.jdialogs.consultarPieza.AsignarUbicacionPiezaJDialog;
import otcapp.controlador.jdialogs.consultarPieza.BuscarPiezaJDialog;
import otcapp.controlador.jdialogs.consultarPieza.DarSalidaPiezaJDialog;
import otcapp.controlador.jinternalFrame.ConsultarPiezasPantalla;
import otcapp.controlador.jpanels.consultarPiezas.ConsultarPiezaTablasJPanel;
import otcapp.controlador.jpanels.consultarPiezas.DetallePiezaJPanel;
import otcapp.controlador.modeloAutocompletar.ModeloAutoCompletarInterno;
import otcapp.controlador.modeloTablas.ModeloTabla;
import otcapp.controlador.modeloTablas.ModeloTablaHitorialSeguimientoPieza;
import otcapp.controlador.modeloTablas.ModeloTablaPiezas;
import otcapp.controlador.modelocombobox.ModeloComboAsuntoPieza;
import otcapp.controlador.modelocombobox.ModeloComboOficina;
import otcapp.controlador.modelocombobox.ModeloComboTipoPieza;
import otcapp.controlador.modelocombobox.ModeloComboUbicacion;
import otcapp.controlador.seguridadDecoradores.FabricaContrladores;
import otcapp.dto.InternoDTO;
import otcapp.dto.PiezaDTO;
import otcapp.dto.ResolucionDTO;
import otcapp.entidades.EstadoPieza;
import otcapp.experto.ExpertoConsultarPieza;
import otcapp.experto.ExpertoIngresarPieza;
import otcapp.experto.excepciones.ExpertoPiezaException;
import otcapp.fabricas.FabricaExpertos;
import otcapp.utiles.UtilesFechas;
import otcapp.utiles.imagenes.iconos.LoadIcon;
import otcapp.utiles.tablas.RenderTablaPiezas;

/**
 *
 * @author diego
 */
public class ConsultarPiezasControlador implements Controlador {

    private ConsultarPiezasPantalla pantalla;
    private ExpertoConsultarPieza experto;
    private BuscarPiezaJDialog buscarPiezaJDialog;
    private ConsultarPiezaTablasJPanel jpanelTablaPiezas;
    private DetallePiezaJPanel jpanelDetallePieza;
    private DarSalidaPiezaJDialog darSalidaPiezaJDialog;
    private AsignarUbicacionPiezaJDialog asignarUbicacionJDialog;
    private PiezaDTO piezaSeleccionada;

    public ConsultarPiezasControlador() {
        pantalla = new ConsultarPiezasPantalla();
        pantalla.getCabeceraJPanelPrincipal().getIcono().setIcon(new ImageIcon(new LoadIcon().loadImagen("Search-red-48.png")));
        experto = (ExpertoConsultarPieza) FabricaExpertos.getInstancia().getExperto(FabricaExpertos.expertos.CONSULTAR_PIEZA);
        jpanelTablaPiezas = new ConsultarPiezaTablasJPanel();
        jpanelDetallePieza = new DetallePiezaJPanel();


        buscarPiezaJDialog = new BuscarPiezaJDialog(((ControladorPrincipal) FabricaContrladores.getInstancia().getControlador(FabricaContrladores.controlador.PRINCIPAL)).getPantallaPrincipal(), true);
        buscarPiezaJDialog.setLocationRelativeTo(null);

        darSalidaPiezaJDialog = new DarSalidaPiezaJDialog(((ControladorPrincipal) FabricaContrladores.getInstancia().getControlador(FabricaContrladores.controlador.PRINCIPAL)).getPantallaPrincipal(), true);
        darSalidaPiezaJDialog.setLocationRelativeTo(null);

        asignarUbicacionJDialog = new AsignarUbicacionPiezaJDialog(((ControladorPrincipal) FabricaContrladores.getInstancia().getControlador(FabricaContrladores.controlador.PRINCIPAL)).getPantallaPrincipal(), true);
        asignarUbicacionJDialog.setLocationRelativeTo(null);

        pantalla.getBtnHabilitarBusqueda().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                buscarPiezaJDialog.setVisible(true);
            }
        });

        pantalla.getBtnSalir().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                finalizar();
            }
        });

        jpanelTablaPiezas.getTblPiezas().addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                seleccionarPieza();
                mostrarDetallePiezaSeleccionadaDTO();
            }
        });

        jpanelDetallePieza.getBtnAtras().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                mostrarPanelTablaPiezas();
            }
        });

        jpanelDetallePieza.getBtnDarSalidaPieza().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                darSalidaPiezaJDialog.setVisible(true);
            }
        });

        jpanelDetallePieza.getBtnMovimientoPieza().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                asignarUbicacionJDialog.setVisible(true);
            }
        });

        jpanelDetallePieza.getBtnEditarPieza().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                editarPieza();
            }
        });


        /**
         * JDIALOG Buscar Pieza
         */
        buscarPiezaJDialog.getBtnBuscarPieza().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                buscarPizas();
            }
        });

        /**
         * JDIALOG Dar salida Pieza
         */
        darSalidaPiezaJDialog.getBtnAceptar().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                darSalidaPieza();
            }
        });
        /**
         * JDIALOG asignar ubicacion Pieza
         */
        asignarUbicacionJDialog.getBtnAceptar().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                asignarUbicacionPieza();
            }
        });

    }

    @Override
    public void iniciar() {
        pantalla.setVisible(true);
        jpanelTablaPiezas.setVisible(true);
        pantalla.getContenedor().add(jpanelTablaPiezas, "piezas");
        pantalla.getContenedor().add(jpanelDetallePieza, "detalle");

        jpanelTablaPiezas.getTblPiezas().setModel(new ModeloTablaPiezas());
        jpanelTablaPiezas.getTblPiezas().setAutoCreateRowSorter(true);
        jpanelTablaPiezas.getTblPiezas().setDefaultRenderer(Object.class, new RenderTablaPiezas());

        buscarPiezaJDialog.getInternosAutocompletar().setModelo(new ModeloAutoCompletarInterno(experto.buscarInternos()));

        jpanelDetallePieza.getTblHistorialSeguimiento().setModel(new ModeloTablaHitorialSeguimientoPieza());

        iniciarCombos();
        buscarPiezasSinFinalizar();

    }

    public void iniciarCombos() {
        buscarPiezaJDialog.getCbxAsunto().setModel(new ModeloComboAsuntoPieza(experto.buscarAsuntos()));
        buscarPiezaJDialog.getCbxTipoPieza().setModel(new ModeloComboTipoPieza(experto.buscarTipos()));
        asignarUbicacionJDialog.getCbxUbicacion().setModel(new ModeloComboUbicacion(experto.buscarUbicaciones()));
        darSalidaPiezaJDialog.getCbxDestinoPieza().setModel(new ModeloComboOficina(experto.buscarOficinas()));
    }

    @Override
    public void finalizar() {
        pantalla.setVisible(false);
    }

    @Override
    public Component getPantalla() {
        return pantalla;
    }

    @Override
    public void continuar() {
        pantalla.setVisible(true);
        if (piezaSeleccionada != null) {
            buscarPiezaxId(piezaSeleccionada.getId());
        }
    }

    public void buscarPizas() {
        ((ModeloTabla) jpanelTablaPiezas.getTblPiezas().getModel()).clear();
        try {
            ((ModeloTabla) jpanelTablaPiezas.getTblPiezas().getModel()).setListaElementos(experto.buscarPiezas(recogerDatosJDialogBuscar()));

        } catch (ExpertoPiezaException ex) {
            JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
            return;
        }
        buscarPiezaJDialog.setVisible(false);
        ((CardLayout) pantalla.getContenedor().getLayout()).show(pantalla.getContenedor(), "piezas");

    }

    private void buscarPiezaxId(long id) {
        experto.buscarPiezaId(id);
    }

    public void buscarPiezasSinFinalizar() {
        ((ModeloTabla) jpanelTablaPiezas.getTblPiezas().getModel()).setListaElementos(experto.buscarPiezasSinFinalizar());
        ((CardLayout) pantalla.getContenedor().getLayout()).show(pantalla.getContenedor(), "piezas");
    }

    public PiezaDTO recogerDatosJDialogBuscar() {
        PiezaDTO dto = new PiezaDTO();
        if (buscarPiezaJDialog.getCbxAsunto().getSelectedIndex() > 0) {
            dto.addAsunto(((ModeloComboAsuntoPieza) buscarPiezaJDialog.getCbxAsunto().getModel()).getAsuntoSeleccionado());
        }
        if (buscarPiezaJDialog.getCbxTipoPieza().getSelectedIndex() > 0) {
            dto.setTipo(((ModeloComboTipoPieza) buscarPiezaJDialog.getCbxTipoPieza().getModel()).getTipoSeleccionado());
        }
        dto.setInterno((InternoDTO) (buscarPiezaJDialog.getInternosAutocompletar().getItemSeleccionado()));
        if (buscarPiezaJDialog.getFechaDesdeJDateChooser().getDate() != null) {
            dto.setFechaEntrada(buscarPiezaJDialog.getFechaDesdeJDateChooser().getDate().getTime());
        }
        if (buscarPiezaJDialog.getFechaHastaJDateChooser().getDate() != null) {
            dto.setFechaHasta(buscarPiezaJDialog.getFechaHastaJDateChooser().getDate().getTime());
        }

        return dto;
    }

    public void seleccionarPieza() {
        int fila = jpanelTablaPiezas.getTblPiezas().getSelectedRow();
        int filaModelo = jpanelTablaPiezas.getTblPiezas().getRowSorter().convertRowIndexToModel(fila);
        piezaSeleccionada = (PiezaDTO) ((ModeloTablaPiezas) jpanelTablaPiezas.getTblPiezas().getModel()).getRow(filaModelo);
    }

    public void mostrarDetallePiezaSeleccionadaDTO() {

        ((CardLayout) pantalla.getContenedor().getLayout()).show(pantalla.getContenedor(), "detalle");

        jpanelDetallePieza.getLblTipo().setText(piezaSeleccionada.getTipo().getNombreTipo());
        jpanelDetallePieza.getLblexpediente().setText(piezaSeleccionada.getNroExpediente());
        jpanelDetallePieza.getLblidentificacion().setText(piezaSeleccionada.getIdentificacion());
        jpanelDetallePieza.getLblinterno().setText(piezaSeleccionada.getInterno().getApellidoNombre());
        if (piezaSeleccionada.getEmplazamientoDias().length() == 0 && piezaSeleccionada.getEmplazamientoHoras().length() == 0) {
            jpanelDetallePieza.getLblemplazamiento().setText("");
        } else {
            jpanelDetallePieza.getLblemplazamiento().setText(piezaSeleccionada.getEmplazamientoDias() + " días, " + piezaSeleccionada.getEmplazamientoHoras() + " horas");
        }
        jpanelDetallePieza.getLblSede().setText(piezaSeleccionada.getSede().getNombreSede());
        jpanelDetallePieza.getLblinicio().setText(piezaSeleccionada.getInicioPieza().getNombreOficina());
        if (piezaSeleccionada.getDestinoPieza() != null) {
            jpanelDetallePieza.getLblDestino().setText(piezaSeleccionada.getDestinoPieza().getNombreOficina());
        } else {
            jpanelDetallePieza.getLblDestino().setText("");
        }
        jpanelDetallePieza.getLblObservacion().setText(piezaSeleccionada.getObservaciones());
        String asuntosString[] = new String[piezaSeleccionada.getAsuntos().size()];
        for (int i = 0; i < piezaSeleccionada.getAsuntos().size(); i++) {
            asuntosString[i] = piezaSeleccionada.getAsuntos().get(i).getNombreAsunto();
        }
        jpanelDetallePieza.getLblFechaEntrada().setText(UtilesFechas.formatearADiaMesAnio(piezaSeleccionada.getFechaEntrada()));
        if (piezaSeleccionada.getFechaSalida() != null) {
            jpanelDetallePieza.getLblFechaSalida().setText(UtilesFechas.formatearADiaMesAnio(piezaSeleccionada.getFechaSalida()));
        } else {
            jpanelDetallePieza.getLblFechaSalida().setText(null);
        }
        jpanelDetallePieza.getListAsunto().setListData(asuntosString);

        if (piezaSeleccionada instanceof ResolucionDTO) {
            ResolucionDTO res = (ResolucionDTO) piezaSeleccionada;
            jpanelDetallePieza.getListConclusiones().setVisible(true);
            jpanelDetallePieza.getLblConclusiones().setVisible(true);
            String conclusionesString[] = new String[res.getConclusiones().size()];
            for (int i = 0; i < res.getConclusiones().size(); i++) {
                conclusionesString[i] = res.getConclusiones().get(i).getBeneficio().getNombreBeneficio() + "->" + res.getConclusiones().get(i).getResultado().getNombreResultado();
            }
            jpanelDetallePieza.getListConclusiones().setListData(conclusionesString);
        } else {
            jpanelDetallePieza.getListConclusiones().setVisible(false);
            jpanelDetallePieza.getLblConclusiones().setVisible(false);
        }
        ((ModeloTabla) jpanelDetallePieza.getTblHistorialSeguimiento().getModel()).setListaElementos(experto.getHistorialSeguimientoPieza(piezaSeleccionada.getId()));

    }

    private void mostrarPanelTablaPiezas() {
        ((CardLayout) pantalla.getContenedor().getLayout()).show(pantalla.getContenedor(), "piezas");
    }

    private void darSalidaPieza() {

        if (piezaSeleccionada != null) {

            piezaSeleccionada.setFechaSalida(darSalidaPiezaJDialog.getjDateFechaSalida().getDate().getTime());
            piezaSeleccionada.setDestinoPieza(((ModeloComboOficina) darSalidaPiezaJDialog.getCbxDestinoPieza().getModel()).getOficinaSeleccionada());
            piezaSeleccionada.setFinalizada(true);
            try {
                ((ExpertoIngresarPieza) FabricaExpertos.getInstancia().getExperto(FabricaExpertos.expertos.INGRESAR_PIEZA)).darSalidaPieza(piezaSeleccionada);
            } catch (ExpertoPiezaException ex) {
                JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "ERROR", JOptionPane.ERROR_MESSAGE);
            }
            JOptionPane.showMessageDialog(pantalla, "Pieza Actualizada", "INFORMACIÓN", JOptionPane.INFORMATION_MESSAGE);
            ((ModeloTabla) jpanelTablaPiezas.getTblPiezas().getModel()).fireTableDataChanged();
            darSalidaPiezaJDialog.setVisible(false);
            darSalidaPiezaJDialog.getCbxDestinoPieza().setSelectedIndex(0);
            darSalidaPiezaJDialog.getjDateFechaSalida().setDate(null);
            mostrarDetallePiezaSeleccionadaDTO();
            ((ModeloTabla) jpanelTablaPiezas.getTblPiezas().getModel()).addRow(piezaSeleccionada);
        }
    }

    private void asignarUbicacionPieza() {
        EstadoPieza ubicacion = ((ModeloComboUbicacion) asignarUbicacionJDialog.getCbxUbicacion().getModel()).getUbicacionSeleccionada();
        String obsercvacion = asignarUbicacionJDialog.getTxtObservacion().getText();
        try {
            piezaSeleccionada = ((ExpertoIngresarPieza) FabricaExpertos.getInstancia().getExperto(FabricaExpertos.expertos.INGRESAR_PIEZA)).setUbicacionPieza(piezaSeleccionada, ubicacion, obsercvacion);
            JOptionPane.showMessageDialog(pantalla, "Seguimiento Actualizado", "INFORMACIÓN: ", JOptionPane.INFORMATION_MESSAGE);
        } catch (ExpertoPiezaException ex) {
            JOptionPane.showMessageDialog(pantalla, ex.getMessage(), "ERROR: ", JOptionPane.ERROR_MESSAGE);
        }
        asignarUbicacionJDialog.getCbxUbicacion().setSelectedIndex(0);
        asignarUbicacionJDialog.getTxtObservacion().setText("");
        asignarUbicacionJDialog.setVisible(false);
        ((ModeloTabla) jpanelTablaPiezas.getTblPiezas().getModel()).fireTableDataChanged();
        mostrarDetallePiezaSeleccionadaDTO();
    }

    private void editarPieza() {
        IngresarPiezaControlador ingresarPiezaControlador = ((IngresarPiezaControlador) ((ControladorPrincipal) FabricaContrladores.getInstancia().getControlador(FabricaContrladores.controlador.PRINCIPAL)).iniciarContrlador(ControladorPrincipal.controlador.INGRESAR_PIEZA));
        ingresarPiezaControlador.iniciar();
        ingresarPiezaControlador.editarPieza(piezaSeleccionada);

    }

    protected void ocultarBotones() {
        jpanelDetallePieza.getBtnDarSalidaPieza().setVisible(false);
        jpanelDetallePieza.getBtnEditarPieza().setVisible(false);
        jpanelDetallePieza.getBtnMovimientoPieza().setVisible(false);
    }

    protected void habilitarBotonDarSalidaPieza() {
        jpanelDetallePieza.getBtnDarSalidaPieza().setVisible(true);
    }

    protected void habilitarBotonEditarPieza() {
        jpanelDetallePieza.getBtnEditarPieza().setVisible(true);
    }

    protected void habilitarBotonMovimientoPieza() {
        jpanelDetallePieza.getBtnMovimientoPieza().setVisible(true);
    }
}
